<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>完全削除の限界と対処法</title>
		<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
		<meta content="ja" http-equiv="Content-Language">
		<link href="main.css" rel="stylesheet" type="text/css">
	</head>
	<body>
		<div class="pagehead">
			<table class="pagetitle">
				<tbody>
					<tr>
						<td><img alt="" height="32" src="pics/ico-trashcan95-1.png" width="32"></td>
						<td width="100%">完全削除の限界と対処法</td>
						<td align="right"><a href="index.html" style="FLOAT: right"><img alt="" height="18" src="pics/ico-home.png" width="61"></a></td>
					</tr>
				</tbody>
			</table>
		</div>
		<div class="pagemain">
			<p>FATファイルシステムでは可能であった完全削除処理が、新世代のNTFSでは難しくなりました。その原因と対処法を簡単に説明します。</p>
			<h1>ファイルシステムと利用テクノロジごとの完全削除（完全消去）の可能性・確実性</h1>
			<p>技術的詳細がわからない方も、この一覧表は必ず通読してください。ここで「削除不可」となっているファイルは、拙作”完全削除”のみでなく、世間で公開されている他の完全消去ソフトウエアでも、技術的に削除不可能・きわめて難しいものです。</p>
			<ul>
				<li>
				FATファイルシステムのファイル → 確実に可能
				<li>
				NTFSの暗号化ファイル（EFS） → 疑問
				<li>
				NTFSの圧縮ファイル → 疑問
				<li>
				NTFSの1kBytes以下（MFTデータストリーム内に収まる）ファイル → 初回データは残存
				<li>
				NTFSのスパース ファイル（かなり特殊な用途のファイル） → 不可
				<li>
				NTFSの代替ストリーム ファイル（かなり特殊な用途のファイル） → 不可
				<li>
					NTFSの<b>上述に当たらない通常のファイル</b>
				→ ほぼ可能
				<li>
				DropboxやAmazon S3などのクラウドに格納されたファイル → 不可
				<li>
					編集時にオリジナルのコピーの一時ファイルを作成するソフト<b>（Microsoft WordやExcel等）のデータファイル</b> → 不可</li>
			</ul>
			<h1>完全消去・完全秘匿に近づくための対策手法</h1>
			<h2>NTFSの圧縮・暗号化機能の無効化</h2>
			<p>ファイル エクスプローラでファイルもしくはフォルダを右クリックして、プロパティよりこれらの機能を確実にOFFにします。なお、暗号化機能はWindows 
				2000/XP/7 Professional版以上でしか使えません（一般のパソコンにバンドルされているWindows XP/7 
				Homeにこの機能は存在しませんので安心してください）。</p>
			<p>また、暗号化・複合化処理に複合化されているファイルを一時ファイルに書き出しているため、セキュリティリスクがあるとMicrosoftが公式に認めていることは留意しておく必要があるでしょう。<br>
				<i>When an existing plaintext file is marked for encryption, it's first copied to a 
					temporary file. When the process is complete, the temporary file is marked for 
					deletion, which means portions of the original file may remain on the disk and 
					could potentially be accessible via a disk editor. These bits of data, referred 
					to as data shreds or remanence, may be permanently removed by using a revised 
					version of the cipher.exe tool.</i> (from: Microsoft TechNet "The 
				Encrypting File System" <a href="http://technet.microsoft.com/en-us/library/cc700811.aspx">
					http://technet.microsoft.com/en-us/library/cc700811.aspx</a>)</p>
			<h2>仮想メモリ機能を無効化する</h2>
			<p>仮想メモリ 
				ファイルに消去したいデータが平文で記録されていては、ファイル本体をいくら完全消去しても意味がありません。十分な物理メモリをコンピュータに取り付けている状態では仮想メモリ機能は無効化するとよいでしょう。
			</p>
			<ul>
				<li>
					Windows 2000/XP/7の場合<br>
					システム コントロールパネル → 詳細設定 → パフォーマンス設定 → 詳細設定 → 仮想メモリ変更 
					を開き、すべてのドライブで”ページングファイルなし”と設定する。設定を行った後は、必ずWindowsの再起動が必要です。</li></ul>
			<ul>
				<li>
					Linuxの場合<br>
					ルート権限で<code>swapoff</code>コマンドを実行して仮想メモリを一時的に無効化できます。再び仮想メモリを使いたくなれば<code>swapon</code>コマンドを実行すればよいでしょう。十分なメモリを搭載していて起動時から仮想メモリを無効化したい場合は、スワップパーティションを削除する必要があります。</li></ul>
			<h2>テンポラリ ディレクトリ内の一時ファイルを削除する</h2>
			<p>Windowsでは環境変数TEMPで示されたテンポラリ 
				ディレクトリに作られる一時ファイルは自動的には削除されません。たとえば、次のようなスクリプトファイルを作成して、タスクスケジューラでシステム起動時や定時に実行するようにすれば、長期間一時ファイルが残存することを阻止できます。ただし、一時ファイルが何らかのソフトウエアで利用中の場合、思わぬ副作用がある可能性もありますので留意してください。</p>
			<div class="code">
del "C:\Documents and Settings\hogehoge\Local Settings\Temp\*.tmp"
			</div>
			<p>なお、環境変数はシステム コントロールパネルで確認する以外にも、コマンドプロンプトで<code>set temp</code>と実行すれば画面に表示されます。</p>
			<h2>ディスク空き領域の削除 （Windows標準の機能）</h2>
			<p>Windows 2000/XP/Vista/7 
				は標準で空き領域の削除コマンドcipher.exeを持っています。管理者権限でログオンし、コマンド・コンソール（cmd.exe）内で次のように実行してください。（d: 
				ドライブを対象とする例）</p>
			<div class="code">
cipher.exe /w:d:
			</div>
			<p>大容量ハードディスクでこの機能を利用した場合、何時間も掛かることに注意してください。150MBytes/secのアクセス速度を持つハードディスクに500GBytes書き込みするのに要する時間は 
				500*1024/150 = 
				3413秒（＝56分）。USB2.0接続のハードディスクなら50MBytes/sec程度しか速度が出ないため168分にもなります。</p>
			<p>【Windows で Cipher.exe を使用して削除済みのデータを上書きする方法 ： <a href="http://support.microsoft.com/kb/315672/ja">
					http://support.microsoft.com/kb/315672/ja</a> 】</p>
			<p>単に大きなファイルを作成してフリー領域を埋めたい場合は、管理者権限で<code>fsutil.exe</code>コマンドを用います。1MBytesのファイル（NULLで埋められている）を作成するには次のようなスクリプトになります。</p>
			<div class="code">
fsutil.exe file createnew ファイル名.txt 1048576
			</div>
			<h2>暗号化仮想ディスクを用いる</h2>
			<p>編集時にオリジナルファイルのコピー（一時ファイル）を作成するMicrosoft 
				Office等のアプリケーションソフトで扱うデータファイルの保存先を、暗号化仮想ディスクとすることで、暗号解読しない限り情報流出しないように対策できます。（一時ファイルも暗号化仮想ディスク中に作成されるため）</p>
			<ul>
				<li>
					Windows / Linux 共通の手法<br>
					<a href="http://www.truecrypt.org/">TrueCrypt</a>（無償ソフトウエア）を用いると、WindowsとLinuxで同じ暗号ディスクファイルを使いまわすことが出来ます。今後、LinuxとWindowsの双方を使う可能性がある場合はこの方法をお勧めします。</li></ul>
			<p><img alt="TrueCrypt" height="264" src="pics/TrueCrypt-6.0a-Linux.png" width="288"><br>
				LinuxでのTrueCrypt実行画面（暗号化ボリューム管理画面）</p>
			<h2>Linuxでファイルの完全削除を行う</h2>
			<p>Linuxでは完全削除を行うプログラム<code>shred</code>が標準で提供されています。1回上書きで完全削除する場合は次のようにします。</p>
			<div class="code">
shred -n 1 -v ファイル名
			</div>
			<h2>ディスク全領域の完全消去処理</h2>
			<p>ハードディスクやUSBメモリーディスクを処分する前に行う、ディスク全領域の完全消去処理についての解説です。この処理を行ったディスクは「残留磁気を読み取るような高度な解析装置」を持つ<i>一部の国家機関やハードディスク製造メーカーが有する世界で数箇所のラボ</i>でしか復元できないといわれています。</p>
			<ul>
				<li>
					Windowsの場合<br>
					消去したいディスクをフォーマットした後に、管理者権限で<code>cipher.exe</code>コマンドを実行します。（D:ドライブを消去する場合）</li></ul>
			<div class="code">
cipher.exe /w:d:
			</div>
			<ul>
				<li>
					Linuxの場合</li></ul>
			<p><code>shred</code>コマンドを用いれば、未フォーマットのディスク全領域を完全消去出来ます。例えば、次のようなコマンドを実行します。</p>
			<div class="code">
shred -n 3 -z -v /dev/sda1
			</div>
			<p>上記の例は、/dev/sda1に対して、3回上書き処理＋1回ゼロクリアを行います。ユーザがより詳細に制御したい場合は、<code>dd</code>コマンドを用いても、これと同様の処理ができます。</p>
			<div class="code">
dd if=/dev/urandom of=/dev/sda1 dd if=/dev/urandom of=/dev/sda1 dd 
				if=/dev/urandom of=/dev/sda1 dd if=/dev/zero of=/dev/sda1
			</div>
			<p>なお、ddを用いるときはブロックサイズを適当な大きさまで拡大しておかないと、ディスクアクセス速度が極めて遅くなるので要注意。たとえば、書き込み単位を10MBytes（10*1024*1024bytes）にする場合は…</p>
			<div class="code">
dd if=/dev/zero of=/dev/sda1 bs=10M
			</div>
			<h1>NTFSでの問題点をもう少し深く技術的に解説</h1>
			<h3>遅延書き込み（キャッシュ システム）</h3>
			<p>NTFSの遅延書き込みによりファイル名およびサイズの「完全削除」が出来ない場合があります。<br>
				また、「非常に効率的な遅延書き込み」が行われている場合、データ領域すら完全削除できない可能性もあります。</p>
			<p>この状況に対する<u>暫定的な対応措置</u>として、<a href="005-4-config.html">機能設定：詳細設定２</a>の「追加削除機能：対象ファイルと同じボリュームに一時ファイルを作る」でディスクキャッシュ量より多いサイズの追加削除（ダミーファイル作成）を行ってください。また、<a href="005-1-config.html">機能設定：基本設定</a>の「ファイル名変更・ファイル 
				サイ変更機能」は機能しない場合がありますので留意してください。</p>
			<h3>圧縮ファイル、暗号化ファイル（EFS）、スパース ファイル</h3>
			<p>圧縮ファイル、暗号化ファイル、スパース･ファイルは「完全削除」できません。これらのファイルにデータを書き込む場合、OSはファイルのコピーを自動的に作成し、そこに書き込むような仕様になっているからです。OSによる強固な書き込みエラー対策である反面、大量のコピーデータがディスク内に拡散してしまうというセキュリティリスクを作ってしまった悪い例です。<br>
				なお、拙作”完全削除”では、スパース ファイルは検出して<b>削除処理をしない</b>ようになっています。</p>
			<h3>MFTデータ ストリーム（データ アトリビュート）</h3>
			<p>MFTのサイズ内に収まる範囲のデータファイルに対する「完全削除」には対応していません。<br>
				原因は、MFTに収まる小さなファイルの最初の作成時に、MFTのミラー領域に作成されたミラー・データが削除後にも残るためです。（MFTのミラー領域は本プログラムでは操作出来ません）</p>
			<p>この状況に対する<u>暫定的な対応措置</u>として、小さなファイル（1000バイト未満と考えて差し支えありません）の<b>作成時</b>には、データの末尾などに「パディング」領域を設けてMFTにデータが格納されるのを防いでください。たとえば、200バイトのテキストファイルなら、後ろに800個のスペース文字を追加するなどしてください。<br>
				MFTミラーにデータが残存することは捨ておくとして、メインMFTのデータストリームに書きこまれているデータを確実に削除するためには、<a href="005-3-config.html">機能設定：詳細設定１</a>の「オーバーラン書き込みサイズ」を0Bytesに設定する必要があります。これは、オーバーラン機能でファイルサイズがMFTデータストリームに収まらなくなった場合、ディスク上に新たにデータ領域が作成され、MFT内は無視（放置）されるからです。</p>
			<h3>代替データ ストリーム（ADS）</h3>
			<p>代替データ ストリーム（マルチデータ 
				ストリーム）を使ったファイルの場合、現在見えている（Explorerで通常扱っている）ストリームに対してのみ「完全削除」が行われます。</p>
			<h3>まとめ</h3>
			<p>NTFSで導入されたこれらの新たな機能により「データ（ディスク）が高度に抽象化されて通常利用時の安定性・安全性」が高まった反面、「特殊な条件下を想定したデータのコントロール権」がユーザから取り上げられてしまったことで、セキュリティリスクがより高まってしまったともいえます。</p>
			<p>ディスク内にデータの「コピー」が大量に拡散されてしまったことに対処するためには、「デフラグAPI」というWindowsシステム管理機能を利用して、ハードディスクの特定クラスタのデータを上書きすると言う手がありますが、管理者権限が必要な事と、ディスク内のどこにデータが拡散したか検知しようすがないというハードルがあります。現在見えているファイルに対してのみの処理では「完全に保証された完全削除処理」することは出来ません。</p>
			<p>よって、圧縮・暗号・スパース 
				ファイルなどのテクノロジを用いている場合は、「全空き領域に巨大なダミーファイルを作り、ダミーデータを書き込む」処理が最低限必要となります。ディスクのフォーマット時間でおわかりのとおり、数TBytesにもなる現在の大容量ディスクでは、これらの処理には何時間もの長い時間がかかります。</p>
			<p>「MFTのデータストリーム領域」に消去されずに残っている残骸データに対しては、前述の巨大ダミーファイルによっても削除不可能なため、ハードディスクの全MFTレコードを解析して未使用のデータストリーム領域を全て消去して回るという膨大な作業が必要で、それらの作業中にOSが勝手にディスクにアクセスに行かないように、ロックを掛けて作業すると言う、「OSの機能の一部として作業するに等しい」プログラムを作成し管理者権限で実行しなければなりません。</p>
			<p>このようなOSが行うべきディスクのガベージコレクションのような作業を、フリーソフトウエア 
				レベルで安全性を保証して実行するなど不可能です。この機能は、商用ソフトウエアに譲る必要がありますので、拙作”完全削除”で実現する構想はありません。</p>
			<h1>NTFS （NTファイルシステム）の概要</h1>
			<p>Windows 
				NT/2000/XP以降で採用されているNTFSの概要は、このヘルプファイルで記述できるほど簡単ではありません。NTFSの簡単な紹介と、「完全削除」を行う場合に関連する点について若干の説明をとどめます。</p>
			<h2>NTFS の特徴</h2>
			<ul>
				<li>
				メタファイル（$MFT、$BOOT、$AttrDef …）によるディスク（ボリューム）管理
				<li>
				ACL (アクセス制御リスト）によるアクセス制御
				<li>
				ジャーナリング ファイル システムによるロールバック処理
				<li>
				ファイル圧縮・暗号化
				<li>
				ユーザごとのクォータ設定
				<li>
				ボリュームのシャドゥ コピー機能で稼動中のスナップショットのバックアップ可
				<li>
				スパース･ファイルのサポート
				<li>
				512Bytesから64kBytesまで柔軟なクラスタサイズの設定
				<li>
				小さなファイルをMFTのデータストリームに入れることが可能
				<li>
					代替データ ストリーム</li>
			</ul>
			<h2>メタファイル</h2>
			<p>NTFSでは、データ領域だけでなく、ディスク（NTFSの説明文ではボリュームと言う）自体の管理情報も含め、全てを「ファイル」として扱っている。その中で、ディスクの管理にかかわるファイルを特に「メタファイル」と言っている。</p>
			<p><img alt="Metafiles" height="273" src="pics/fig-ntfs-metafile.png" width="435"></p>
			<h2>MFT</h2>
			<p>ボリューム上に存在するファイルは、全て「マスター ファイル テーブル（MFT)」によりリスト管理されている。<br>
				ヘッダには、最初のアトリビュートの位置とフリーエリアの先頭位置の情報などが含まれている。アトリビュートはファイル名、ボリューム名、セキュリティ記述子、データなどさまざまなものが定義されており、必要に応じて（必要な数だけ）使われる。</p>
			<p><img alt="MFT" height="183" src="pics/fig-ntfs-mft.png" width="545"></p>
			<p>アトリビュートは以下のようなものがあり、MFTでは、$FILE_NAME、$SECURITY_DESCRIPTERはほぼ常に存在している。</p>
			<p><img alt="attribute lists" height="273" src="pics/fig-ntfs-attr.png" width="279"></p>
			<p>各アトリビュートは、先頭にはヘッダ（MFTのヘッダとは違う）があり、その後にアトリビュートごとに定義されたデータが続いている。<br>
				参考例として、$FILE_NAME アトリビュートを下に示す。</p>
			<p><img alt="$FILENAME attributes" height="240" src="./pics/fig-ntfs-filename.png" width="294"></p>
			<h2>ファイルの例</h2>
			<p>実際のファイルの格納は、これらの機構を使って下の図のように行われている。データサイズが小さなファイルの場合は、直接MFTのフリーエリアに$DATAアトリビュートを作りそこに格納する。（FATからの大きな進歩）</p>
			<p><img alt="file" height="218" src="./pics/fig-ntfs-file.png" width="413"></p>
		</div>
	</body>
</html>
